home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mach / sun3.md / machIntr.s < prev    next >
Text File  |  1992-12-18  |  4KB  |  159 lines

  1. |* machIntr.s -
  2. |*
  3. |*     Contains the interrupt handlers.
  4. |*
  5. |* Copyright 1989 Regents of the University of California
  6. |* Permission to use, copy, modify, and distribute this
  7. |* software and its documentation for any purpose and without
  8. |* fee is hereby granted, provided that the above copyright
  9. |* notice appear in all copies.  The University of California
  10. |* makes no representations about the suitability of this
  11. |* software for any purpose.  It is provided "as is" without
  12. |* express or implied warranty.
  13. |*
  14.  
  15.  
  16. #include "machConst.h"
  17. #include "machAsmDefs.h"
  18. .data
  19. .asciz "$Header: /cdrom/src/kernel/Cvsroot/kernel/mach/sun3.md/machIntr.s,v 9.3 90/10/19 15:46:08 rab Exp $ SPRITE (Berkeley)"
  20.     .even
  21.     .globl    _machSpuriousCnt
  22. _machSpuriousCnt:    .long    0
  23.     .globl    _machLevel1Cnt
  24. _machLevel1Cnt:    .long    0
  25.     .globl    _machLevel2Cnt
  26. _machLevel2Cnt:    .long    0
  27.     .globl    _machLevel3Cnt
  28. _machLevel3Cnt:    .long    0
  29.     .globl    _machLevel4Cnt
  30. _machLevel4Cnt:    .long    0
  31.     .globl    _machLevel5Cnt
  32. _machLevel5Cnt:    .long    0
  33.     .globl    _machLevel6Cnt
  34. _machLevel6Cnt:    .long    0
  35.  
  36. .even
  37. .text
  38.  
  39. |*
  40. |* ----------------------------------------------------------------------------
  41. |*
  42. |* Interrupt handling --
  43. |*
  44. |*     Handle exceptions.  Enter the debugger for unsuported interrupts.
  45. |*
  46. |* Results:
  47. |*     None.
  48. |*
  49. |* Side effects:
  50. |*     None.
  51. |*
  52. |* ----------------------------------------------------------------------------
  53. |*
  54.     .globl    _proc_RunningProcesses
  55.  
  56.     .globl    MachSpurious
  57. MachSpurious:
  58.     addl    #1,_machSpuriousCnt
  59.     CallTrapHandler(MACH_SPURIOUS_INT)
  60.  
  61.     .globl    MachLevel1Int
  62. MachLevel1Int:
  63.     addl    #1,_machLevel1Cnt
  64.     CallTrapHandler(MACH_LEVEL1_INT)
  65.  
  66.     .globl    MachLevel2Int
  67. MachLevel2Int:
  68.     addl    #1,_machLevel2Cnt
  69.     CallTrapHandler(MACH_LEVEL2_INT)
  70.  
  71.     .globl    MachLevel3Int
  72. MachLevel3Int:
  73.     addl    #1,_machLevel3Cnt
  74.     CallTrapHandler(MACH_LEVEL3_INT)
  75.  
  76.     .globl    MachLevel4Int
  77. MachLevel4Int:
  78.     addl    #1,_machLevel4Cnt
  79.     CallTrapHandler(MACH_LEVEL4_INT)
  80.  
  81.     .globl    MachLevel5Int
  82. MachLevel5Int:
  83.     addl    #1,_machLevel5Cnt
  84. /*    movl    sp@(2), _Prof_InterruptPC */
  85.     CallTrapHandler(MACH_LEVEL5_INT)
  86.  
  87.     .globl    MachLevel6Int
  88. MachLevel6Int:
  89.     addl    #1,_machLevel6Cnt
  90.     CallTrapHandler(MACH_LEVEL6_INT) 
  91.  
  92. /*
  93.  * ----------------------------------------------------------------------------
  94.  *
  95.  * Call a Vectored Interrupt Handler --
  96.  *
  97.  *      Call an interrupt handler.  The temporary registers d0, d1, a0 and a1
  98.  *    are saved first, then interrupts are disabled and an "At Interrupt 
  99.  *    Level" flag is set so the handler can determine that it is running a
  100.  *    interrupt level.  The registers are restored at the end.
  101.  *    This code assumes that if the interrupt occured in user mode, and if
  102.  *    the specialHandling flag is set on the way back to user mode, then
  103.  *    a context switch is desired. Note that schedFlags is not checked.
  104.  *
  105.  *  Algorithm:
  106.  *    Save temporary registers
  107.  *    Determine if interrupt occured while in kernel mode or user mode
  108.  *    Compute the routine it call and its clientdata using the vector
  109.  *        from the VOR register.
  110.  *    Call routine
  111.  *    if interrupt occured while in user mode.
  112.  *        if specialHandling is set for the current process 
  113.  *                Set the old status register trace mode bit on.
  114.  *            Clear the specialHandling flag.
  115.  *        endif
  116.  *    endif
  117.  *    restore registers
  118.  *        
  119.  *
  120.  * ----------------------------------------------------------------------------
  121.  */
  122.  
  123. #define    INTR_SR_OFFSET    16
  124. #define    INTR_VOR_OFFSET    22
  125. .even
  126. .text
  127.     .globl _MachVectoredInterrupt
  128.  
  129. _MachVectoredInterrupt:
  130. /*    movl    sp@(2), _Prof_InterruptPC */
  131.     moveml    #0xC0C0, sp@-
  132.     movw    #MACH_SR_HIGHPRIO, sr 
  133.     movw    sp@(INTR_SR_OFFSET), d0
  134.     andl    #MACH_SR_SUPSTATE, d0
  135.     movl    d0, _mach_KernelMode
  136.     movl    #1, _mach_AtInterruptLevel 
  137.         movw    sp@(INTR_VOR_OFFSET), d0 
  138.     andl     #1020, d0 
  139.         lea      _machInterruptRoutines, a0 
  140.         lea     _machInterruptArgs, a1 
  141.         movel     a1@(d0:l),sp@-
  142.     movel     a0@(d0:l),a0
  143.     jbsr     a0@ 
  144.     addql     #4, sp 
  145.     clrl    _mach_AtInterruptLevel 
  146.     tstl    _mach_KernelMode
  147.     bne    1f
  148.     movl    _proc_RunningProcesses, a0
  149.     movl    a0@, a1
  150.     movl    _machSpecialHandlingOffset, d1
  151.     tstl    a1@(0,d1:l)
  152.     beq    1f
  153.     clrl    a1@(0,d1:l)
  154.     movw    sp@(INTR_SR_OFFSET), d0
  155.     orw    #MACH_SR_TRACEMODE, d0
  156.     movw    d0, sp@(INTR_SR_OFFSET)
  157. 1:    moveml    sp@+, #0x0303
  158.     rte 
  159.